#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//qsort函数可以排序任意类型的数据
//void qsort(	void* base, //指向待排序数组的第一个元素 --> void* 方便接收任意类型的地址
//			size_t num, //base指向数组的元素个数
//			size_t size,//每个元素所占字节数
//			int (*cmp)(const void* p1, const void* p2)); //函数指针，指向的函数可以比较数组中的两个元素 --> 针对不同类型的数据提供不同的比较方法
//			//p1指向的元素比p2指向的元素小，返回<0的数字
//			//p1指向的元素比p2指向的元素大，返回>0的数字
//          //p1和p2指向的元素相等，返回0


//int cmp_int(const void* a, const void* b)
//{
//	return *(int*)a - *(int*)b;
//}
//
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test01()
//{
//	int arr[] = { 1,2,3,6,7,8,4,5,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	//qsort参数：
//	//qsort(void* base, size_t nmemb, size_t size, int (*compare)(const void*, const void*))
//
//	print_arr(arr, sz);
//
//}


//===========================================================

//int cmp_int(const void* a, const void* b)
//{
//	return *(int*)a - *(int*)b;
//}
//
//void Swap(void* a, void* b, int width)
//{
//	char* pa = (char*)a;
//	char* pb = (char*)b;
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		char temp = pa[i];
//		pa[i] = pb[i];
//		pb[i] = temp;
//	}
//
//	//for (i = 0; i < width; i++)
//	//{
//	//	char temp = *pa;
// //       *pa = *pb;
// //       *pb = temp;
// //       pa++;
// //       pb++;
//	//}
//}
//
//void BubbleSort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
//{
//	int i, j;
//	int flag = 0;//优化
//	for (i = 0; i < sz - 1; i++)
//	{
//        flag = 0;//假设已经有序了
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (cmp_int((char*)base + j * width, (char*)base + (j+1) * width) > 0)
//			{
//				Swap((char*)base + j * width, (char*)base + (j+1) * width, width);
//                flag = 1;//说明这一趟冒泡排序的数据是无序的
//			}
//		}
//        if (flag == 0)
//        {
//            break;
//        }
//	}
//}
//
//void print_arr(void* arr, int sz, int width)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(int*)((char*)arr + i * width));
//	}
//	printf("\n");
//}
//
//void test02()
//{
//	//重新改造一下BubbleSort函数，来实现对任意数据类型的排序。
//	int arr[] = { 1,2,3,6,7,8,4,5,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	BubbleSort(arr, sz, sizeof(int), cmp_int);
//	print_arr(arr, sz, sizeof(int));
//}

//===========================================================

//struct Stu
//{
//    char name[20];
//    int age;
//};
//
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//void Swap(void* a, void* b, int width)
//{
//	char* pa = (char*)a;
//	char* pb = (char*)b;
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		char temp = pa[i];
//		pa[i] = pb[i];
//		pb[i] = temp;
//	}
//
//	//for (i = 0; i < width; i++)
//	//{
//	//	char temp = *pa;
// //       *pa = *pb;
// //       *pb = temp;
// //       pa++;
// //       pb++;
//	//}
//}
//
//
//void BubbleSort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
//{
//	int i, j;
//	int flag = 0;//优化
//	for (i = 0; i < sz - 1; i++)
//	{
//        flag = 0;//假设已经有序了
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			//if (cmp_stu_by_name((char*)base + j * width, (char*)base + (j+1) * width) > 0)
//			//{
//			//	Swap((char*)base + j * width, (char*)base + (j+1) * width, width);
//   //             flag = 1;//说明这一趟冒泡排序的数据是无序的
//			//}
//            if (cmp_stu_by_age((char*)base + j * width, (char*)base + (j+1) * width) > 0)
//            {
//                Swap((char*)base + j * width, (char*)base + (j+1) * width, width);
//                flag = 1;//说明这一趟冒泡排序的数据是无序的
//            }
//		}
//        if (flag == 0)
//        {
//            break;
//        }
//	}
//}
//
//void print_arr(void* arr, int sz, int width)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%s %d\n", ((struct Stu*)((char*)arr + i * width))->name, ((struct Stu*)((char*)arr + i * width))->age);
//	}
//	printf("\n");
//}
//
//
//
//void test03()
//{
//    struct Stu arr[] = {
//        {"zhangsan", 18},
//        {"lisi", 19},
//        {"wangwu", 17},
//        {"zhaoliu", 20},
//        {"tianqi", 16},
//    };
//
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    //BubbleSort(arr, sz, sizeof(struct Stu), cmp_stu_by_name);
//	//qsort(arr, sz, sizeof(struct Stu), cmp_stu_by_name);
//	BubbleSort(arr, sz, sizeof(struct Stu), cmp_stu_by_age);
//    print_arr(arr, sz, sizeof(struct Stu));
//
//}
//
//int main()
//{
//    //test01();
//    //test02();
//	test03();
//
//	return 0;
//}

